/**
 * @file Lote.java
 * @brief Entidad que representa un lote de un determinado medicamento en el stock
 *        de farmacia.
 *
 * Copyright (C)  - April [2011]
 *
 * @author Miguel Ángel Díaz López
 * @version 01.00
 *
 * @footnote e-mail:  admin at etsiit.es
 */

package GestorFarmacia;

import Definiciones.Definiciones;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

/**
 * @class Lote
 * @brief Representa un lote de un determinado medicamento en el stock
 *        dentro de la farmacia.
 */
public class Lote {
    /* Declaración de las variables de instancia */
    private Integer _id_lote;
    private Integer _unidades_iniciales;
    private Integer _unidades_restantes;
    private Date _fecha_llegada;
    private Date _fecha_caducidad;
    private Definiciones.Estado _estado;
    private Integer _id_medicamento_asociado;

    /* Constructor */
    public Lote() {
        this._id_lote = null;
        this._unidades_iniciales = null;
        this._unidades_restantes = null;
        this._fecha_caducidad = null;
        this._fecha_llegada = null;
        this._estado = null;
        this._id_medicamento_asociado = null;
    }
    public Lote(Integer id_lote, Integer unidades_iniciales, Integer unidades_restantes, Date fecha_llegada,
                Date fecha_caducidad, Definiciones.Estado estado, Integer id_medicamento) {
        this._id_lote = id_lote;
        this._unidades_iniciales = unidades_iniciales;
        this._unidades_restantes = unidades_restantes;
        this._fecha_llegada = fecha_llegada;
        this._fecha_caducidad = fecha_caducidad;
        this._estado = estado;
        this._id_medicamento_asociado = id_medicamento;
    }
    
    /* Métodos de clase */
    public static void add ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        LoteDAO.add(lote);
    }
    public static void delete ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        LoteDAO.delete(lote);
    }
    public static void update ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        LoteDAO.update(lote);
    }
    public static Lote get ( Integer id_lote ) throws SQLException, IOException, ClassNotFoundException, ParseException {
        Lote lote_buscado = LoteDAO.get(id_lote);
        return lote_buscado;
    }
    public static Lote[] get ( Integer id_medicamento, Integer unidades_iniciales, Integer unidades_restantes, Date fecha_llegada,
                                Date fecha_caducidad, Definiciones.Estado estado)
                                throws SQLException, IOException, ClassNotFoundException, ParseException {
        Lote[] l_lotes = LoteDAO.get(id_medicamento,unidades_iniciales,unidades_restantes,fecha_llegada,fecha_caducidad,estado);
        return l_lotes;
    }
    public static Lote[] getLotesCaducados ( Date fecha ) throws SQLException, IOException, ClassNotFoundException, ParseException {
        Lote[] lotes = null;
        Lote[] v_lotes = null;
        ArrayList<Lote> l_lotes = new ArrayList<Lote>();
        // Formato fecha
        DateFormat anioFormato = new SimpleDateFormat("yyyy");
        DateFormat mesFormato = new SimpleDateFormat("MM");
        DateFormat diaFormato = new SimpleDateFormat("dd");
        // Fecha a comparar
        int anio = Integer.parseInt(anioFormato.format(fecha).toString());
        int mes = Integer.parseInt(mesFormato.format(fecha).toString());
        int dia = Integer.parseInt(diaFormato.format(fecha).toString());
        // Buscamos los LOTES de los medicamentos caducados
        lotes = Lote.get(null,null,null,null,null,Definiciones.Estado.DISPONIBLE); // Todos los lotes de la BD "DISPONIBLES"
        if(lotes == null) return v_lotes;
        for(int i=0; i<lotes.length; i++){
            Date caducidad = lotes[i].getFechaCaducidadLote();
            if (anio > Integer.parseInt(anioFormato.format(caducidad).toString())){
                l_lotes.add(lotes[i]);
            } else if(anio == Integer.parseInt(anioFormato.format(caducidad).toString())){
                if(mes > Integer.parseInt(mesFormato.format(caducidad).toString())){
                    l_lotes.add(lotes[i]);
                } else if(mes == Integer.parseInt(mesFormato.format(caducidad).toString())){
                    if(dia > Integer.parseInt(diaFormato.format(caducidad).toString()))
                        l_lotes.add(lotes[i]);
                }
            }
        }
        // Devolvemos los lotes caducados*/
        if(l_lotes.size()>0){
            v_lotes = new Lote[l_lotes.size()];
            l_lotes.toArray(v_lotes);
        }
        return v_lotes;
    }

    /* Métodos de instancia */
    /**
     * @brief Consultas sobre el objeto "Lote"
     * @return "consulta"
     */
     public Integer getIdLote () {
         return this._id_lote;
     }
     public Integer getUnidadesInicialesLote () {
         return this._unidades_iniciales;
     }
     public Integer getUnidadesRestantesLote () {
         return this._unidades_restantes;
     }
     public Date getFechaLlegadaLote() {
         return this._fecha_llegada;
     }
     public Date getFechaCaducidadLote() {
         return this._fecha_caducidad;
     }
     public Definiciones.Estado getEstadoLote() {
         return this._estado;
     }
     public Medicamento getMedicamento() throws SQLException, ClassNotFoundException, IOException, ParseException {
         if (this._id_medicamento_asociado == null)
             this._id_medicamento_asociado = Lote.get(this._id_lote).getIdMedicamento();
         return Medicamento.get(this._id_medicamento_asociado);
     }
     public Integer getIdMedicamento() {
         return this._id_medicamento_asociado;
     }
    
     /**
     * @brief Modificaciones realizadas en el objeto "Lote"
     * @param nuevo valor para dicha modificación
     */
     public void setIdLote (Integer id_lote) {
         this._id_lote = id_lote;
     }
     public void setUnidadesInicialesLote (Integer unidades_iniciales) {
         this._unidades_iniciales = unidades_iniciales;
     }
     public void setUnidadesRestantesLote (Integer unidades_restantes) {
         this._unidades_restantes = unidades_restantes;
     }
     public void setFechaLlegadaLote (Date fecha_llegada) {
         this._fecha_llegada = fecha_llegada;
     }
     public void setFechaCaducidadLote (Date fecha_caducidad) {
         this._fecha_caducidad = fecha_caducidad;
     }
     public void setEstadoLote (Definiciones.Estado estado) {
         this._estado = estado;
     }
     public void setIdMedicamento(Integer id_medicamento) {
         this._id_medicamento_asociado = id_medicamento;
     }
}
